/*
 * @Descripttion: 用户操作相关中间件
 * @version: 
 * @Author: 一氧化二氢
 * @Date: 2022-01-01 22:53:25
 * @lastEditorTime: Do no edit
 */
//密码加密模块
const bcrypt = require('bcryptjs')
const { getUserInfo } = require('../service/user.service')
// 错误类型
const { userFormateError, userAlreadyExisted, userRegisterError, userDoesNotExist,
    userLoginError, invalidPassword } = require('../constant/err.type')
/**
 * @name: 
 * @test: test font
 * @msg: 用户输入信息验证器，主要验证用户输入的信息是否符合标准，用户名和密码非空
 * @return {*}
 * @param {*} ctx
 * @param {*} next
 */
const userValidator = async (ctx, next) => {
    const { user_name, password } = ctx.request.body
    //合法性
    if (!user_name || !password) {
        //记录错误日志
        console.error('用户名或者密码为空', ctx.request.body)
        //提交错误
        ctx.app.emit('error', userFormateError, ctx)
        return
    }
    await next()
}

/**
 * @name: 
 * @test: test font
 * @msg:验证数据库中是否有该用户信息 
 * @return {*}
 * @param {*} ctx
 * @param {*} next
 */
const verifyUser = async (ctx, next) => {
    const { user_name } = ctx.request.body
    //合理性 查询是否数据库中已经有该用户
    // if (await getUserInfo({ user_name })) {
    //     console.log("用户已经存在",ctx.request.body)
    //     ctx.app.emit("error", userAlreadyExisted, ctx)
    //     return
    // }
    try {
        const res = await getUserInfo({ user_name })
        if (res) {
            console.error("用户已经存在", ctx.request.body)
            ctx.app.emit("error", userAlreadyExisted, ctx)
            return
        }
    } catch (err) {
        console.log("获取用户信息错误", err)
        ctx.app.emit('error', userRegisterError, ctx)
        return
    }
    //执行下一个中间件
    await next()
}

/**
 * @name: 
 * @test: test font
 * @msg: 密码加密
 * @return {*}
 * @param {*} ctx
 * @param {*} next
 */
const cryptPassword = async (ctx, next) => {
    const { password } = ctx.request.body

    //生成盐
    const salt = bcrypt.genSaltSync(10)
    //用盐和明文生成密文
    const hash = bcrypt.hashSync(password, salt)

    ctx.request.body.password = hash

    await next()
}

/**
 * @name: 
 * @test: test font
 * @msg: 登录验证方法
 * @return {*}
 * @param {*} ctx
 * @param {*} next
 */
const verifyLogin = async (ctx, next) => {
    //1.判断用户是否存在（不存在：报错）
    const { user_name, password } = ctx.request.body
    try {
        const res = await getUserInfo({ user_name })
        if (!res) {
            console.error("用户名不存在", { user_name })
            ctx.app.emit('error', userDoesNotExist, ctx)
            return
        }
        //2.密码是否匹配（不匹配：报错）
        if (!bcrypt.compareSync(password, res.password)) {
            console.error("密码不匹配", { user_name, password })
            ctx.app.emit("error", invalidPassword, ctx)
            return
        }
        await next()
    } catch (err) {
        console.error(err)
       return ctx.app.emit("error", userLoginError, ctx)
    }


}

module.exports = {
    userValidator,
    verifyUser,
    cryptPassword,
    verifyLogin
}